/**
 * 全局 Composables
 * 提供更优雅的全局单例访问方式
 */

import { getCurrentInstance, inject } from 'vue'
import { globalSingleton } from './singleton.js'

/**
 * 获取全局单例 - 最优雅的方式
 * 无需任何导入，直接在组件中使用
 * @returns {GlobalSingleton}
 */
export const useGlobal = () => {
  const instance = getCurrentInstance()

  if (instance) {
    // 优先尝试通过 inject 获取
    try {
      const injectedSingleton = inject('globalSingleton', null)
      if (injectedSingleton) {
        return injectedSingleton
      }
    } catch (e) {
      // 继续尝试其他方式
    }

    // 尝试通过全局属性获取
    const globalProperty = instance.appContext.config.globalProperties.$globalSingleton
    if (globalProperty) {
      return globalProperty
    }
  }

  // 备用方案：直接返回单例实例
  return globalSingleton
}

/**
 * 获取全局单例 - 兼容版本
 * @returns {GlobalSingleton}
 */
export const useGlobalSingleton = useGlobal

/**
 * 直接导出单例实例 - 最简单的方式
 */
export const $global = globalSingleton

/**
 * 数据操作的便捷方法
 */
export const useGlobalData = () => {
  const global = useGlobal()

  return {
    // 数据操作
    setData: global.setData.bind(global),
    getData: global.getData.bind(global),
    removeData: global.removeData.bind(global),
    hasData: global.hasData.bind(global),
    clearData: global.clearData.bind(global),

    // 缓存操作
    setCache: global.setCache.bind(global),
    getCache: global.getCache.bind(global),
    removeCache: global.removeCache.bind(global),
    clearCache: global.clearCache.bind(global),
    getCacheStats: global.getCacheStats.bind(global),

    // 配置操作
    setConfig: global.setConfig.bind(global),
    getConfig: global.getConfig.bind(global),
    getAllConfig: global.getAllConfig.bind(global),

    // 事件操作
    on: global.addEventListener.bind(global),
    off: global.removeEventListener.bind(global),
    emit: global.dispatchEvent.bind(global),

    // 工具方法
    getStats: global.getStats.bind(global),
    getAllKeys: global.getAllKeys.bind(global),
    exportData: global.exportData.bind(global)
  }
}

/**
 * 事件系统的便捷方法
 */
export const useGlobalEvents = () => {
  const global = useGlobal()

  return {
    on: global.addEventListener.bind(global),
    once: (eventName, callback) => global.addEventListener(eventName, callback, { once: true }),
    off: global.removeEventListener.bind(global),
    emit: global.dispatchEvent.bind(global),
    clear: global.removeAllEventListeners.bind(global)
  }
}

/**
 * 配置管理的便捷方法
 */
export const useGlobalConfig = () => {
  const global = useGlobal()

  return {
    get: global.getConfig.bind(global),
    set: global.setConfig.bind(global),
    remove: global.removeConfig.bind(global),
    getAll: global.getAllConfig.bind(global)
  }
}

/**
 * 缓存管理的便捷方法
 */
export const useGlobalCache = () => {
  const global = useGlobal()

  return {
    get: global.getCache.bind(global),
    set: global.setCache.bind(global),
    remove: global.removeCache.bind(global),
    clear: global.clearCache.bind(global),
    clearExpired: global.clearExpiredCache.bind(global),
    stats: global.getCacheStats.bind(global)
  }
} 